package com.yuw.jdbc.db;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import com.yuw.utils.MyUtils;

public class DBProvider {

	/**
	 * 获取数据库连接对象
	 * 
	 * @return 数据库连接对象
	 */
	public Connection getConn() {
		// 返回类型
		Connection conn = null;
		try {
			// (0) 读取数据库配置文件信息
			// 加载属性文件为输入流对象
			// 注意：数据库配置文件要写在src根目录下
			InputStream is = DBProvider.class.getClassLoader().getResourceAsStream("db.properties");
			// 创建Porperties属性类
			Properties prop = new Properties();
			// 加载数据库配置文件流
			prop.load(is);

			// (1) 注册加载数据库驱动
			// 数据库驱动主类的包路径名，使用反射加载
			String strDirverName = prop.getProperty("DirverName");
			Class.forName(strDirverName);
			// (2) 获取数据库连接对象
			String strUrl = prop.getProperty("Url");
			// 用户名
			String strUserName = prop.getProperty("UserName");
			// 密码
			String strUserPsw = prop.getProperty("UserPsw");

			// 从驱动管理类中获取指定参数的数据库连接对象
			conn = DriverManager.getConnection(strUrl, strUserName, strUserPsw);
		} catch (Exception e) {
			// 数据库创建连接异常
			System.out.println("数据库创建连接异常:" + e.getMessage());
			e.printStackTrace();
		}
		// 返回值
		return conn;
	}

	/**
	 * 执行查询操作
	 * 
	 * @param strSql
	 *            查询的sql语句
	 * @return 查询结果集ResultSet
	 */
	public ResultSet query(String strSql) {
		// 返回值类型
		ResultSet rs = null;
		try {
			// 获取数据库连接对象
			Connection conn = this.getConn();
			// (3) 获取statement执行器，执行sql语句
			Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			// (4) 获取statement执行结果集resultset，并解析
			// 执行查询操作
			rs = st.executeQuery(strSql);
		} catch (SQLException e) {
			// 数据库操作类查询异常
			System.out.println("数据库操作类查询异常:" + e.getMessage());
			e.printStackTrace();
		}
		return rs;
	}

	/**
	 * 执行查询操作
	 * 
	 * @param strSql
	 *            查询的sql语句
	 * @return 查询结果集list
	 */
	public List<Map<String, Object>> queryList(String strSql) {
		// 返回值类型
		List<Map<String, Object>> lst = null;
		try {
			// 获取数据库连接对象
			Connection conn = this.getConn();
			// (3) 获取statement执行器，执行sql语句
			Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			// (4) 获取statement执行结果集resultset，并解析
			// 执行查询操作
			ResultSet rs = st.executeQuery(strSql);
			// 调用公用方法将，Resultset转换为list对象
			lst = MyUtils.convertResultSet2List(rs);
			// 关闭资源
			rs.close();
			conn.close();
		} catch (SQLException e) {
			// 数据库操作类查询异常
			System.out.println("数据库操作类查询异常:" + e.getMessage());
			e.printStackTrace();
		}
		return lst;
	}

	/**
	 * 执行查询操作
	 * 
	 * @param <T>
	 * 
	 * @param strSql
	 *            查询的sql语句
	 * @param clazz
	 *            实体类的Class对象
	 * @return 查询结果集list
	 */
	public <T> List<T> queryBeanList(String strSql, Class<T> clazz) {
		// 返回值类型
		List<T> lst = null;
		try {
			// 获取数据库连接对象
			Connection conn = this.getConn();
			// (3) 获取statement执行器，执行sql语句
			Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
			// (4) 获取statement执行结果集resultset，并解析
			// 执行查询操作
			ResultSet rs = st.executeQuery(strSql);
			// 调用公用方法将，Resultset转换为list对象
			lst = MyUtils.convertResultSet2BeanList(rs, clazz);
			// 关闭资源
			rs.close();
			conn.close();
		} catch (SQLException e) {
			// 数据库操作类查询异常
			System.out.println("数据库操作类查询异常:" + e.getMessage());
			e.printStackTrace();
		}
		return lst;
	}

	/**
	 * 新增数据
	 * 
	 * @param strSql
	 *            执行的sql语句
	 * @return 影响的记录行数
	 */
	public int save(String strSql) {
		// 返回值
		int i = 0;
		try {
			// 获取数据库连接对象
			Connection conn = this.getConn();
			// (3) 获取statement执行器，执行sql语句
			Statement st = conn.createStatement();
			// (4) 执行sql语句
			i = st.executeUpdate(strSql);
			// 关闭资源
			conn.close();
		} catch (Exception e) {
			// 数据库操作类新增异常
			System.out.println("数据库操作类新增数据异常:" + e.getMessage());
			e.printStackTrace();
		}
		return i;
	}

	/**
	 * 新增数据
	 * 
	 * @param strSql
	 *            执行的sql语句
	 * @param objParas
	 *            参数数组
	 * @return 影响的记录行数
	 */
	public int save(String strSql, Object[] objParas) {
		// 返回值
		int i = 0;
		try {
			// 获取数据库连接对象
			Connection conn = this.getConn();
			// (3) 获取PreparedStatement执行器，执行sql语句
			PreparedStatement pst = conn.prepareStatement(strSql);
			// 将参数数组给pst
			if (objParas != null) {
				for (int k = 1; k <= objParas.length; k++) {
					pst.setObject(k, objParas[k - 1]);
				}
			}
			// (4) 执行sql语句
			i = pst.executeUpdate();
			// 关闭资源
			conn.close();
		} catch (Exception e) {
			// 数据库操作类新增异常
			System.out.println("数据库操作类新增数据异常:" + e.getMessage());
			e.printStackTrace();
		}
		return i;
	}

	/**
	 * 修改数据
	 * 
	 * @param strSql
	 *            执行的sql语句
	 * @return 影响的记录行数
	 */
	public int update(String strSql) {
		// 返回值
		int i = 0;
		try {
			// 获取数据库连接对象
			Connection conn = this.getConn();
			// (3) 获取statement执行器，执行sql语句
			Statement st = conn.createStatement();
			// (4) 执行sql语句
			i = st.executeUpdate(strSql);
			// 关闭资源
			conn.close();
		} catch (Exception e) {
			// 数据库操作类新增异常
			System.out.println("数据库操作类新增数据异常:" + e.getMessage());
			e.printStackTrace();
		}
		return i;
	}

	/**
	 * 删除数据
	 * 
	 * @param strSql
	 *            执行的sql语句
	 * @return 影响的记录行数
	 */
	public int delete(String strSql) {
		// 返回值
		int i = 0;
		try {
			// 获取数据库连接对象
			Connection conn = this.getConn();
			// (3) 获取statement执行器，执行sql语句
			Statement st = conn.createStatement();
			// (4) 执行sql语句
			i = st.executeUpdate(strSql);
			// 关闭资源
			conn.close();
		} catch (Exception e) {
			// 数据库操作类新增异常
			System.out.println("数据库操作类新增数据异常:" + e.getMessage());
			e.printStackTrace();
		}
		return i;
	}
}
